package com.neusoft.nep.entity;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * FileUtils 类提供了一些用于文件读写的工具方法。
 * 主要用于读取和写入存储用户信息的文件。
 */
public class FileUtils {

    /**
     * 从指定的文件中读取一个 Map 对象。
     *
     * @param fileName 文件名
     * @return 读取到的 Map 对象，如果文件不存在或为空，则返回一个空的 HashMap。
     */
    public static Map readMapObject(String fileName) {
        File file = new File(fileName); // 创建一个 File 对象，表示指定的文件
        Map map = null; // 用于存储读取到的 Map 对象

        try {
            // 如果文件长度为 0（即文件为空），则返回一个新的空 HashMap
            if (file.length() == 0) {
                map = new HashMap<>();
            } else {
                // 创建一个 FileInputStream 对象，用于读取文件
                FileInputStream fis = new FileInputStream(file);
                ObjectInputStream ois = null; // 创建一个 ObjectInputStream 对象，用于读取对象
                try {
                    ois = new ObjectInputStream(fis);
                } catch (IOException e) {
                    throw new RuntimeException(e); // 如果发生 IOException，则抛出 RuntimeException
                }
                // 从文件中读取对象，并将其强制转换为 Map 类型
                map = (Map) ois.readObject();
            }
        } catch (FileNotFoundException e) {
            // 如果文件未找到，则抛出 RuntimeException
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            // 如果读取的对象类未找到，则抛出 RuntimeException
            throw new RuntimeException(e);
        } catch (IOException e) {
            // 如果发生其他 IO 异常，则抛出 RuntimeException
            throw new RuntimeException(e);
        }
        // 返回读取到的 Map 对象
        return map;
    }

    /**
     * 将一个 Map 对象写入指定的文件。
     *
     * @param fileName 文件名
     * @param map      要写入的 Map 对象
     */
    public static void writeMapObject(String fileName, Map map) {
        try {
            File file = new File(fileName); // 创建一个 File 对象，表示指定的文件
            // 如果文件不存在，则创建一个新的文件
            if (!file.exists()) {
                file.createNewFile();
            }
            // 创建一个 FileOutputStream 对象，用于写入文件
            FileOutputStream fos = new FileOutputStream(file);
            // 创建一个 ObjectOutputStream 对象，用于写入对象
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            // 将 Map 对象写入文件
            oos.writeObject(map);
            oos.flush(); // 刷新输出流，确保数据写出
        } catch (IOException e) {
            // 如果发生 IOException，则抛出 RuntimeException
            throw new RuntimeException(e);
        }
    }
}
